package demo03;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 *  java.text.DateFormat：日期/时间格式化子类的抽象类
 *  作用：
 *      格式化（也就是日期 -> 文本）、解析（文本-> 日期）
 *  成员方法：
 *      String format(Date date) 按照指定的模式，把Date日期格式化为指定的字符串
 *      Date parse(String source) 把符合模式的字符串解析为Date日期
 *  DateFormat类是一个抽象类，无法直接创建对象使用，可以使用DateFormat的子类
 * 
 *  java.text.SimpleDateFormat extends DateFormat
 *  构造方法：
 *      SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
 *      参数：
 *          String pattern：传递指定的模式
 *      模式：（区分大小写）
 *          y   年
 *          M   月
 *          d   日
 *          H   时
 *          m   分
 *          s   秒
 *      写入对应的模式，会把模式替换为对应的日期时间
 *          "yyyy-MM-dd HH:mm:ss"
 *          "yyyy年MM月dd日 HH时mm分ss秒"
 *      注意：
 *          模式中的字母不能更改，连接模式的符号可以改变
 */
public class Demo01DateFormat {
    public static void main(String[] args) throws ParseException { // demo02方法抛出异常，主方法也可以继续抛出异常来处理
        demo01();
        demo02();
    }

    /*
     *  使用DateFormat类中的方法parse，把文本解析为日期
     *  Date parse(String source) 把符合模式的字符串解析为Date日期
     *  使用步骤：
     *      1. 创建SimpleDateFormat对象，构造方法中传递指定的格式
     *      2. 调用SimpleDateFormat对象中的方法parse，把符合构造方法中模式的字符串解析为Date日期
     *  注意：
     *      public Date parse(String source) throws ParseException
     *      parse方法声明了一个异常：ParseException解析异常
     *      如果字符串和构造方法中的模式不一样，那么程序就会抛出此异常
     *      调用一个抛出了异常的方法，就必须处理这个异常，要么throws继续声明抛出该异常，要么try...catch自行处理该异常
     *      vscode可通过快速修复功能，自动生成throws语句或try...catch语句
     */
    private static void demo02() throws ParseException { // 方法中所调用的方法抛出了异常，可以通过在本方法继续抛出该异常来进行处理
        // 1. 创建SimpleDateFormat对象，构造方法中传递指定的格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 2. 调用SimpleDateFormat对象中的方法parse，把符合构造方法中模式的字符串解析为Date日期
        Date date = simpleDateFormat.parse("2022-01-01 00:00:00");
        System.out.println(date); // Sat Jan 01 00:00:00 CST 2022
        date = simpleDateFormat.parse("2022-01-01 00:00"); // ParseException解析异常，格式与构造中定义的不同，抛出异常
        System.out.println(date);
    }

    /*
     *  使用DateFormat中的方法format，把日期转化为文本
     *  String format(Date date) 按照指定的模式，把Date日期格式化为指定的字符串
     *  使用步骤：
     *      1. 创建SimpleDateFormat对象，构造方法中传递指定的格式
     *      2. 调用SimpleDateFormat对象中的方法format，按照构造方法中指定的模式，把Date日期格式化为符合模式的字符串（文本）
     */
    private static void demo01() {
        // 1. 创建SimpleDateFormat对象，构造方法中传递指定的格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 2. 调用SimpleDateFormat对象中的方法format，按照构造方法中指定的模式，把Date日期格式化为符合模式的字符串（文本）
        Date date = new Date();
        String string = simpleDateFormat.format(date);
        System.out.println(date); // Mon Jul 25 10:46:43 CST 2022
        System.out.println(string); // 2022-07-25 10:46:43

        SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
        System.out.println(simpleDateFormat2.format(date)); // 2022年07月25日 10时46分43秒，使用新格式转换
    }
}
